﻿Shader "ShaderLab_Study/GaussianBlur" {
	Properties {
			_MainTex ("Base (RGB)", 2D) = "white" {}
	}
	SubShader {

		CGINCLUDE

		#include "UnityCG.cginc"

		uniform sampler2D _MainTex;
		uniform half4 _MainTex_TexelSize;
		uniform float _BlurSize;

		struct v2f
		{
			float4 pos:SV_POSITION;
			half2 uv[5]:TEXCOORD0; 
		}; 

		v2f vertBlurVertical(appdata_img v)
		{
			v2f o;
			o.pos = UnityObjectToClipPos(v.vertex);

			half2 uv = v.texcoord;

			o.uv[0] = uv;
			o.uv[1] = uv + float2(0.0,_MainTex_TexelSize.y * 1.0) * _BlurSize;
			o.uv[2] = uv - float2(0.0,_MainTex_TexelSize.y * 1.0) * _BlurSize;
			o.uv[3] = uv + float2(0.0,_MainTex_TexelSize.y * 2.0) * _BlurSize;
			o.uv[4] = uv - float2(0.0,_MainTex_TexelSize.y * 2.0) * _BlurSize;

			return o;
		}

		v2f vertBlurHorizontal(appdata_img v)
		{
			v2f o;
			o.pos = UnityObjectToClipPos(v.vertex);
			
			half2 uv = v.texcoord;
			
			o.uv[0] = uv;
			o.uv[1] = uv + float2(_MainTex_TexelSize.x * 1.0, 0.0) * _BlurSize;
			o.uv[2] = uv - float2(_MainTex_TexelSize.x * 1.0, 0.0) * _BlurSize;
			o.uv[3] = uv + float2(_MainTex_TexelSize.x * 2.0, 0.0) * _BlurSize;
			o.uv[4] = uv - float2(_MainTex_TexelSize.x * 2.0, 0.0) * _BlurSize;
					 
			return o;
		}

		fixed4 fragBlur(v2f i):SV_Target
		{
			//5x5的高斯分布卷积可拆分为
			//(0.0545,0.2442,0.4026,0.2442,0.0545) * (0.0545,0.2442,0.4026,0.2442,0.0545)^T
			float gaussianWeight[3] = {0.4026, 0.2442, 0.0545};
			
			fixed3 sum = tex2D(_MainTex, i.uv[0]).rgb * gaussianWeight[0];

			for (int j = 1; j < 3; j++) {
				sum += tex2D(_MainTex, i.uv[j*2-1]).rgb * gaussianWeight[j];
				sum += tex2D(_MainTex, i.uv[j*2]).rgb * gaussianWeight[j];
			}
			
			return fixed4(sum, 1.0);
		}



		ENDCG
		ZTest Always
		Cull Off
		ZWrite Off
		Pass {

			NAME "GAUSSIAN_BLUR_VERTICAL"

			CGPROGRAM

			#pragma vertex vertBlurVertical
			#pragma fragment fragBlur
		
			ENDCG
		}

		Pass {

			NAME "GAUSSIAN_BLUR_HORIZONTAL"

			CGPROGRAM

			#pragma vertex vertBlurHorizontal
			#pragma fragment fragBlur
		
			ENDCG
		}		
	}
	FallBack "Diffuse"
}
